17-2 おwd腄G@う

資料庫可以儲存大量的資料,但是我們必須能夠有一套有效的方法來搜尋我們所要的資料,才能發揮資料庫的最大功效。本節我們將說明如何對 Access 資料庫進行資料查詢,特別著重經由圖形使用者介面(Graphic User Interface,簡稱GUI)來進行查詢,這些查詢最後可以轉成資料庫之間通用的結構化查詢語言(簡稱SQL,詳見後述),並可由ASP來下達這些命令。

我們還是以 song01.mdb 來說明。首先開啟資料庫,同時點選「建立/查詢設計」,如下:

點選後,畫面如下:

此時按「新增」,就可以將資料表「song」加入目前的查詢,然後按「關閉」。如果要找「張惠妹所唱的歌曲」,可以分兩步驟:

  1. 選取相關欄位:我們可以點選上半部的「歌曲名稱」,然後拖放到下半部的第一個欄位,再點選上半部的「主唱者」,然後拖放到下半部的第二個欄位。(或是可以直接雙擊上半部的欄位即可。)
  2. 設定欄位選取準則:將「主唱者」欄位的「準則」空格填入「張惠妹」。

所呈現的畫面如下:

若要執行查詢,可以直接點選工具列的驚嘆號,得到結果如下:

很明顯地,所列出來的資料就是張惠妹所唱的歌。當你要關掉這個查詢結果時,Access 會詢問你是否要儲存這個查詢,你可以將它直接儲存成「張惠妹所唱的歌曲」。下次只要你點選這個查詢,系統自然就會從資料表中,抓出並顯示符合查詢準則的資料。

事實上,一個查詢可以有不同的檢視方式,例如:

若要顯示「SQL檢視」,只要在打開查詢後(使用「設計檢視」或「資料表檢視」),點選工具列的「檢視」按鈕,並下拉至「SQL 檢視」,如下:

這時候 Access 就會顯示對應於此查詢的 SQL 指令:

Hint
Access 由「設計檢視」產生 SQL 指令時,有時候會在資料表名稱或欄位名稱加上中括弧,以避開資料表名稱或欄位名稱中,可能出現的空白或其它特殊字元。

在使用 ASP 與資料庫進行整合時,對資料庫的處理都必須倚賴 SQL 指令,因此你可以先用「設計檢視」產生你要的查詢,再將此查詢轉換成 SQL 指令,就應該可以直接貼到 ASP 的程式碼裡面了!有關於 SQL 指令的用法,本節只有簡略介紹,下一章將有更完整的說明。

SQL 指令的語法很類似英文自然語言,不需多做說明,以下我們將舉幾個範例來展示如何由「設計檢視」來產生SQL指令。

若要查詢「張惠妹所唱的歌(依年代由近而遠排序)」,則可以在查詢加入「年份」欄位後,並點選「排序」,下拉選擇「遞減」,畫面如下:

此時只要再點選工具列的驚嘆號,就會顯示查詢結果。

若要查詢「張惠妹在 1998 年所唱的歌」,則可以在「年份」欄位新增準則,畫面如下:

相對應的 SQL 指令如下:

SELECT song.歌曲名稱, song.主唱者, song.年份 FROM song WHERE (((song.主唱者)="張惠妹") AND ((song.年份)=1998));

以上的查詢條件都是以「且」為主,若要看看「或」的範例,考慮下列查詢:「2002年的歌曲或是由張惠妹主唱的歌曲」,查詢畫面如下:

換句話說,如果有數個條件必須同時成立(「且」,And),我們就要將比對字串或數值放在「準則」的同一列。如果這些條件只要一個成立即可(「或」,Or),我們就要將這些條件放在「準則」以下的不同列。以 Access 的圖形使用者介面來進行查詢,只能用於當所有的比對條件都是「且」或都是「或」的情況,若有較複雜的邏輯判斷式,就必須靠 SQL 指令來達成。

在上述查詢中,相對應的 SQL 指令如下:

SELECT song.歌曲名稱, song.主唱者, song.年份 FROM song WHERE (((song.主唱者)="張惠妹")) OR (((song.年份)=2002));

若要查詢「歌星列表」,可以使用滑鼠右鍵點選「準則」後,選取「合計」功能,如下:

此時會在查詢畫面多一個名稱為「合計」橫列,其內容為「群組」,此功能可以將相同的紀錄先排序後,再將相同的數筆紀錄合併成一筆,查詢畫面如下:

執行查詢後,結果如下:

因為使用「群組」功能,所以上述結果是已經排序過的結果。相對應的 SQL 指令如下:

SELECT song.主唱者 FROM song GROUP BY song.主唱者;

其中的 "GROUP BY" 就是「群組」功能,可以將相同的數筆紀錄合併成一筆。另一個功能相同的 SQL 指令如下:

SELECT DISTINCT song.主唱者 FROM song;

此查詢可得到相同結果,但是卻無法由「設計檢視」看到 DISTINCT 的功能,只能由「SQL檢視」來指定之。

如果是要查詢「歌曲總數」,可以在產生「合計」橫列後,將滑鼠焦點移到「群組」,就可以顯示下拉選單的按鈕,按下後,請選擇「筆數」,如下:

執行查詢後,結果如下:

代表資料表中共有 11 筆資料。相對應的 SQL 指令如下:

SELECT Count(song.歌曲名稱) AS 歌曲名稱之筆數 FROM song;

在設計查詢時,「設計檢視」雖然很好用,但有時候也會發生「指定不周詳」的錯誤,此時還得靠「SQL檢視」來補強。例如,如果要查「張惠妹所唱歌曲的總數」,一般直覺的做法是將「主唱者」的「準則」設定成「張惠妹」,並選取「合計」的「群組」功能,如下:

可是當你執行查詢時,會產生「準則運算式的資料類型不符合」的錯誤訊息,若選用「SQL檢視」,可看到相對應的 SQL 指令,如下: SELECT Count(song.主唱者) AS 主唱者之筆數 FROM song HAVING (((Count(song.主唱者))="張惠妹"));

很明顯的,錯誤發生在最後一列的條件,因為 Count 是一個函數,只能用來計算資料的筆數,所以我們可以用手動改成:

SELECT Count(song.主唱者) AS 主唱者之筆數 FROM song HAVING (((song.主唱者)="張惠妹"));

然後再選用「設計檢視」,得到的畫面如下:

Hint
上述的「設計檢視」畫面事實上有點亂,而且不容易懂,這也顯示有一些簡單的查詢可能還是用 SQL 命令最適合,若要用簡單易懂的圖形介面來表示,反而有困難。

查詢結果如下:

若要查詢「每一位歌手唱過的歌曲數目」,則可以在「主唱者」欄位選取「合計/群組」,然後在「歌曲名稱」欄位選取「合計/筆數」,設計檢視的畫面如下:

若選用「SQL檢視」,可看到相對應的 SQL 指令,如下: SELECT song.主唱者, Count(song.歌曲名稱) AS 歌曲名稱之筆數 FROM song GROUP BY song.主唱者; 查詢結果如下:

Hint
事實上,在上述範例中,第二個欄位只是用來計數,所以可以任意選,不必一定是「歌曲名稱」,也可以得到同樣的結果。

本小節只有說明對單一資料表的查詢,下一小節將說明兩個資料表之間可能產生的關聯性。


JScript 程式設計與應用:用於伺服器端的 ASP 環境